package com.lyf.design.practice.theory.create.singleton;

/**
 * 加锁保证安全
 * synchronized的加锁位置
 *
 * @author LYF
 * @date 2022/6/19
 */
public class Singleton3 {
    /**
     * 对象存入方法区（静态变量）
     */
    private static Singleton3 singleton3 = null;

    /**
     * 私有化构造函数（反射依旧可拿到）
     */
    private Singleton3(){}

    /**
     * 静态方法获取该类的唯一对象实例
     * @return
     */
    static  Singleton3 getInstance(){// 直接方法加锁--粒度过粗 synchronized

        // 改进1：代码片段加锁 -- 依旧粒度过大，不管是否加锁都来抢锁
//        synchronized (Singleton3.class){
//            if(singleton3==null){
//                singleton3 = new Singleton3();
//            }
//        }

        // 改进2：双检锁
        if(singleton3==null){
            synchronized (Singleton3.class){
             if(singleton3==null){ // 还需要进行判断，存在同时进来抢锁
                singleton3 = new Singleton3();
               }
            }
        }
        return singleton3;
    }

}
